Contents
  1. 1. 引言
  2. 2. BigDecimal简介
  3. 3. 测试代码
    1. 3.1. 构造函数
    2. 3.2. JDK的描述:
    3. 3.3. 通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
  4. 4. 补充:

参考:
http://blog.csdn.net/jackiehff/article/details/8582449
《改善java程序的151个建议》

引言

  借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

BigDecimal简介

  BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。

测试代码

构造函数

  • (主要测试参数类型为double和String的两个常用构造函数)
    1
    2
    3
    4
    5
    6
    7
    BigDecimal aDouble =new BigDecimal(1.22);
    System.out.println("construct with a double value: " + aDouble);
    BigDecimal aString = new BigDecimal("1.22");
    System.out.println("construct with a String value: " + aString);
    输出结果如下:
    construct with a doublevalue:1.2199999999999999733546474089962430298328399658203125
    construct with a String value: 1.22

JDK的描述:

  1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)(十进制小数转化为二进制的方法是乘二取整)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
  2、另一方面,String 构造方法是完全可预知的:写入 new BigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。
  3、当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。

1
2
3
4
5
6
7
8
9
10
11
double a = 1.25;
BigDecimal b = new BigDecimal(Double.toString(a));//常用构造方法
double c = b.doubleValue();
BigDecimal d = BigDecimal.valueOf(a);//常用构造方法
System.out.println("b: " + b);
System.out.println("c: " + c);
System.out.println("d: " + d);
输出:
b: 1.25
c: 1.25
d: 1.25

通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。

1
2
3
4
5
例如:
public BigDecimal add(BigDecimal value);//加法
public BigDecimal subtract(BigDecimal value); //减法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法

  进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] main){

double a = 1.25;
double b = 0.4;
BigDecimal c = new BigDecimal(Double.toString(a));
BigDecimal d = BigDecimal.valueOf(b);
BigDecimal e = c.add(d);
System.out.println(e);
}
输出:
1.65

补充:

  另一种方法是使用整数,把参与运算的值扩大100倍,并转变为整型,然后在展现时再缩小100.0倍,这样处理的好处是简单,准确,一般在非金融行业(如零售业)应用比较多,此方法还会用于某些零售pos机

Contents
  1. 1. 引言
  2. 2. BigDecimal简介
  3. 3. 测试代码
    1. 3.1. 构造函数
    2. 3.2. JDK的描述:
    3. 3.3. 通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
  4. 4. 补充: